package 哈希表;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @PackageName: 只出现一次的数字 III
 * @ClassName: LeetCode260
 * @Author: chen jinxu
 * @Date: 2023/10/16 19:37
 * @Description: //
 * 给你一个整数数组 nums，其中恰好有两个元素只出现一次，其余所有元素均出现两次。
 * 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。
 * 你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。
 * 输入：nums = [1,2,1,3,2,5]
 * 输出：[3,5]
 * 解释：[5, 3] 也是有效的答案。
 * <p>
 * 输入：nums = [-1,0]
 * 输出：[-1,0]
 * <p>
 * 输入：nums = [0,1]
 * 输出：[1,0]
 */
public class LeetCode260 {
    public static void main(String[] args) {
        System.out.println(Arrays.stream(singleNumber(new int[]{1, 2, 1, 3, 2, 5})).boxed().collect(Collectors.toList()));
        System.out.println(Arrays.stream(singleNumber(new int[]{-1, 0})).boxed().collect(Collectors.toList()));
        System.out.println(Arrays.stream(singleNumber(new int[]{0, 1})).boxed().collect(Collectors.toList()));
    }

    static int[] singleNumber(int[] nums) {
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            map.put(nums[i], map.getOrDefault(nums[i], 0) + 1);
        }
        int[] ans = new int[2];
        int index = 0;
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            if (entry.getValue() == 1) {
                ans[index++] = entry.getKey();
            }
        }
        return ans;
    }
}
